﻿// 10008  家庭作业.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>


using namespace std;
/*
https://loj.ac/p/10008

题目描述
老师在开学第一天就把所有作业都布置了，每个作业如果在规定的时间内交上来的话才有学分。
每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为 10，要求在 6 天内交，那么要想拿到这 10 学分，就必须在第 6 天结束前交。

每个作业的完成时间都是只有一天。例如，假设有 7 次作业的学分和完成时间如下：

作业号	期限	学分
1	1	6
2	7
3	3	2
4	1
5	2	4
6	5
7	6	1
最多可以获得 15 学分，其中一个完成作业的次序为 2,6,3,1,7,5,4，注意可能还有其他方法。

你的任务就是找到一个完成作业的顺序获得最大学分。

输入格式
第一行一个整数 N，表示作业的数量；

接下来 N 行，每行包括两个整数，第一个整数表示作业的完成期限，第二个数表示该作业的学分。

输出格式
输出一个整数表示可以获得的最大学分。保证答案不超过 C/C++ 的 int 范围。

样例
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1

15



数据范围与提示
对于 100% 的数据，N <=  10^6，作业的完成期限均小于 7* 10^5。
*/

const int N = 1000010;
struct SEG {
	int r, v;
}segs[N];
int n;
int used[N];

bool cmp(const struct SEG& a, const struct SEG& b) {
	return a.v > b.v;
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> segs[i].r >> segs[i].v;
	}

	sort(segs+1,segs+1+n,cmp);
	int ans = 0; int last = 0;
	for (int i = 1; i <= n; i++) {
		int t = segs[i].r; int v = segs[i].v;
		int find = 0;
		if (t <= last) continue;
		for (int j = t; j >= 1; j--) {
			if (used[j] == 0) {
				used[j] = i; ans += v; find = 1; break;
			}
		}
		if (find == 0) {
			last = t;
		}
	}
	cout << ans << endl;
	return 0;
}
 